package com.todod.common.util;

/**
 * 获取经纬度之间距离
 * 
 * @author ChenShuang
 * 
 */
public final class GeoUtil {

	/**
	 * 地球半径：6378.137KM
	 */
	private static double EARTH_RADIUS = 6378.137;

	/**
	 * 根据经纬度和距离返回一个矩形范围
	 * 
	 * @param lng      经度
	 * @param lat      纬度
	 * @param distance 距离(单位为米)
	 * @return [lng1,lat1, lng2,lat2] 矩形的左下角(lng1,lat1)和右上角(lng2,lat2)
	 */
	public static double[] getRectangle(double lng, double lat, long distance) {
		float delta = 111000;
		if (lng != 0 && lat != 0) {
			double lng1 = lng - distance / Math.abs(Math.cos(Math.toRadians(lat)) * delta);
			double lng2 = lng + distance / Math.abs(Math.cos(Math.toRadians(lat)) * delta);
			double lat1 = lat - (distance / delta);
			double lat2 = lat + (distance / delta);
			return new double[] { lng1, lat1, lng2, lat2 };
		} else {
			// TODO ZHCH 等于0时的计算公式
			double lng1 = lng - distance / delta;
			double lng2 = lng + distance / delta;
			double lat1 = lat - (distance / delta);
			double lat2 = lat + (distance / delta);
			return new double[] { lng1, lat1, lng2, lat2 };
		}
	}

	/**
	 * 得到两点间的距离 千米
	 * 
	 * @param lat1 第一点纬度
	 * @param lng1 第一点经度
	 * @param lat2 第二点纬度
	 * @param lng2 第二点经度
	 * @return
	 */
	public static double getDistanceOfMeter(double latitude1, double longitude1, double latitude2, double longitude2) {

		// 纬度
		double lat1 = Math.toRadians(latitude1);
		double lat2 = Math.toRadians(latitude2);
		// 经度
		double lng1 = Math.toRadians(longitude1);
		double lng2 = Math.toRadians(longitude2);
		// 纬度之差
		double a = lat1 - lat2;
		// 经度之差
		double b = lng1 - lng2;
		// 计算两点距离的公式
		double s = 2 * Math.asin(Math
				.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(b / 2), 2)));
		// 弧长乘地球半径, 返回单位: 千米
		s = s * EARTH_RADIUS;
		return s;
	}
}